﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include <assert.h>


//strcpy 的使用和模拟实现

//1.原字符串必须以'\0'结尾
//2.拷贝时会将'\0'
//3.目标空间必须足够大，确保可以存放原字符串
//4.目标空间要可以修改

//用法展示
//int main()
//{
//	char ch1[] = "abcdef";
//	char ch2[100];
//	strcpy(ch2, ch1);
//	printf("ch2 = %s", ch2);
//	return 0;
//}

//my_strcpy函数代码实现
//char* my_strcpy(char* ch2, const char* ch1)
//{
//	char* ret = ch2;
//	assert(ch2 != NULL);
//	assert(ch1 != NULL);
//	while (*ch2++ = *ch1++)
//		;
//	return ret;
//}
//
//int main()
//{
//	char ch1[] = "abcdef";
//	char ch2[100] = { 0 };
//	printf("ch2 = %s", my_strcpy(ch2, ch1));
//	return 0;
//}



//strcat函数的使用和模拟实现
//源字符串必须以 '\0' 结束。
//⽬标字符串中也得有 \0 ，否则没办法知道追加从哪⾥开始。
//⽬标空间必须有⾜够的⼤，能容纳下源字符串的内容。
//⽬标空间必须可修改。

//函数使用
//int main()
//{
//	char ch1[1000] = " hello ";
//	char ch2[1000] = "ouquyang";
//	strcat(ch1, ch2);
//	printf("ch1 = %s", ch1);
//	return 0;
//}


//函数代码模拟实现
//char* my_strcat(char* ch1, char* ch2)
//{
//	char* ret = ch1;
//	assert(ch1 != NULL);
//	assert(ch2 != NULL);
//	while (*ch1)
//		ch1++;
//	while (*ch1++ = *ch2++)
//		;
//	return ret;
//}
//int main()
//{
//	char ch1[1000] = "hello ";
//	char ch2[] = "ouquyang";
//	printf("ch1 = %s", my_strcat(ch1, ch2));
//	return 0;
//}






////模拟实现strcpy
//char* my_strcpy(char* ch2, char* ch1)
//{
//	char* ret = ch2;
//	while(*ch2++ = *ch1++)
//		;
//	return ret;
//}
//int main()
//{
//	char ch1[] = "abcdef";
//	char ch2[100] = { 0 };
//	printf("%s\n", my_strcpy(ch2, ch1));
//	return 0;
//}


////模拟实现strcat
//char* my_strcat(char* ch1, char* ch2)
//{
//	char* ret = ch1;
//	while (*ch1)
//		ch1++;
//	while (*ch1++ = *ch2++)
//		;
//	return ret;
//}
//int main()
//{
//	char ch1[100] = "hello ";
//	char ch2[100] = "ou yang";
//	printf("%s", my_strcat(ch1, ch2));
//	return 0;
//}


//题目名称：
//单身狗1
//题目内容：
//在一个整型数组中，只有一个数字出现一次，其他数组都是成对出现的，请找出那个只出现一次的数字。
//
//例如：
//
//数组中有：1 2 3 4 5 1 2 3 4，只有5出现一次，其他数字都出现2次，找出5

// ^ 按位异或 - 相同为0，相异为1
// n ^ n =0
// n ^ 0 =n

// 5 0000 0101
// 5 0000 0101
// 0 0000 0000

// 5 0000 0101
// 0 0000 0000
// 5 0000 0101

//int text(int arr[], int sz)
//{
//	int ret = 0;
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		ret ^= arr[i];
//	}
//	return ret;
//}
//
//int main()
//{
//	int arr[] = { 1,2,3,4,5,1,2,3,4 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int ret = text(arr, sz);
//	printf("单身狗是：%d\n", ret);
//	return 0;
//}


//题目名称：
//字符串逆序
//题目内容：
//写一个函数，可以逆序一个字符串的内容。
//void strnp(char* ch)
//{ 
//	int left = 0;
//	int right = strlen(ch)-1;//下标 = 总数-1
//	while (left < right)
//	{
//		int tmp = ch[left];
//		ch[left] = ch[right];
//		ch[right] = tmp;
//		left++;
//		right--;
//	}
//}
//
//int main()
//{
//	char ch[] = "abcdef";
//	strnp(ch);
//	printf("%s", ch);
//	return 0;
//}
 

//void strnp(char* ch)
//{
//	int left = 0;
//	int right = strlen(ch) - 1;//下标 = 总数-1
//	while (left < right)
//	{
//		int tmp = ch[left];
//		ch[left] = ch[right];
//		ch[right] = tmp;
//		left++;
//		right--;
//	}
//}
//int main()
//{
//	char str[10000] = { 0 };
//	while (gets(str))
//	{
//		strnp(str);
//		printf("%s\n", str);
//	}
//	return 0;
//}

//实现一个函数，可以左旋字符串中的k个字符
//void Left_turn(char* ch, int n)
//{
//	int right = 0;
//	int i = 0;
//	int len = strlen(ch);
//	char ret;
//	while (n)
//	{
//		ret = ch[0];
//		for (i = 0; i < len; i++)
//		{
//			if (4 == i)
//			{
//				ch[i] = ret;
//			}
//			if (i <= 3)
//			{
//				ch[i] = ch[i + 1];
//			}
//		}
//		n--;
//	}
//}
//int main()
//{
//	char ch[] = "ABCDE";
//	int n = 0;
//	scanf("%d", &n);
//	Left_turn(ch, n);
//	printf("%s", ch);
//	return 0;
//}

//void left_turn(char* str, int time)
//{
//	int i, j, tmp;
//	int len = strlen(str);
//	time %= len;
//	for (i = 0; i < time; i++)
//	{
//		tmp = str[0];
//		for (j = 0; j < len - 1; j++)
//		{
//			str[j] = str[j + 1];
//		}
//		str[j] = tmp;
//	}
//}
//int main()
//{
//	char str[1000] = "abcdef";
//	int time = 0;
//	while (scanf("%d", &time) != EOF)
//	{
//		left_turn(str, time);
//		printf("%s\n", str);
//	}
//}

